package com.dys.testio03;


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @className: src.main.java.com.dys.testio03.FileInputStreamTest
 * @description: src.main.java.com.dys.testio03
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/15 下午8:23
 */
public class FileInputStreamTest {

    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) throws IOException {
        new FileInputStreamTest().bufferByteRead();
    }

    /**
     * 一个字节，一个字节的读取
     *
     * @throws IOException
     */
    public void oneByteRead() throws IOException {
        // 1.有一个源文件
        File f = new File("E:\\cert (1).png");
        // 2.将一个字节流怼到源文件上去
        FileInputStream fis = new FileInputStream(f);
        // 3.开始读取
        /*
         * 细节1：文件是utf-8进行存储的，所以英文字符底层实际占用1个字节，但是中文字符底层实际占用3个字节
         * 细节2：如果文件是文本文件，那么就不要使用字节流读取了，建议使用字符流
         * 细节3：read()没读取一个字节，返回值是int类型，而不是byte类型，read()方法底层做了处理，让返回数据都是正数
         * 就是为了避免，如果字节返回-1的话，到底是读入的字节，还是到文件结尾呢?
         * */
        int n = fis.read();
        // 定义一个计数器，用来记录读入的字节个数
        int count = 0;
        while (n != -1) {
            count++;
            System.out.println(n);
            n = fis.read();
        }
        System.out.println("count=" + count);
        // 4.关流
        fis.close();
    }

    /**
     * 利用字节流将文件中内容读到程序中来：
     *
     * @throws IOException
     */
    public void bufferByteRead() throws IOException {
        // 1.有一个源文件
        File f = new File("E:\\cert (1).png");
        // 2.将一个字节流怼到源文件上去
        FileInputStream fis = new FileInputStream(f);
        // 3.开始读取
        // 利用缓冲数组：快递员的小车
        byte[] buffer = new byte[1024 * 6];
        int n = fis.read(buffer);
        while (n != -1) {
            // System.out.println(n);
            for (int i = 0; i < n; i++) {
                System.out.println(buffer[i]);
            }
            n = fis.read(buffer);
        }
        // 4.关流
        fis.close();
    }
}
